/*
	t*0.018446
	默认使用12MHz晶振
	定时器没有设置AUXR时，与51相同，十二个时钟周期 = 一个机器周期 
	
	15单片机 1T模式 一个时间周期 = 一个机器周期！！！
	
*/


#include "ultrasonic.h"

unsigned char Ultrasonic_Time_Flag;	//200ms置1
//unsigned int  Buzzer_Time_Flag = 1000;
//unsigned char Buzzer_Alarm_Flag;



/*
	TX引脚发送40KHz方波信号驱动超声波发送探头
	1/40KHz = 0.000025s = 0.025ms = 25us
	使用软件延时注意RC振荡器频率
*/
void Ultra_Delay25us()		//@12.000MHz 超声波专用的延时函数
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 72;
	while (--i);
}


void Ultra_Send_wave(void)	//发送40KHz的方波信号函数
{
	unsigned char i;
	for (i = 0; i < 8; i ++ )
	{
		TX = 1; Ultra_Delay25us();
		TX = 0; Ultra_Delay25us();
	}
}

//超声波测距函数 用定时器1当做计数器
int Ultrasonic_Ranging(void)
{
	unsigned int Ranging_Time;	//测距的时间
	float f_Distance;
	int int_ret_Distance;	
	if (1 == Ultrasonic_Time_Flag)	//200ms接受一次数据
	{
		Ultrasonic_Time_Flag = 0;	//200ms时间标志位置0
//		EA = 0;
		Ultra_Send_wave();	//发送方波信号
//		EA = 1;
		TR1 = 1;		//启动计时
		while ((1 == RX) && (0 == TF1));	//等待收到脉冲
		TR1 = 0;		//关闭计时
		
		if (1 == TF1)	//发生溢出
		{
			TF1 = 0;
			f_Distance = 99;	//报错误数据
		}
		else
		{
			//Ranging_Time = (TH1<<8) | TL1;
			Ranging_Time = TH1*256 + TL1; 
			f_Distance = Ranging_Time*0.017;	//0.017 @12MHz 和 0.18446 @11.0592MHz
			f_Distance /= 12.0;	//STC15单片机运行速度是51单片机的12倍，这里要除以12.0
			
			int_ret_Distance = (int)f_Distance;
			
			if (int_ret_Distance >= 99) int_ret_Distance = 99;	//限幅
		}
		TH1 = 0;	//复位清零
		TL1 = 0;		
	}
	return int_ret_Distance;
}



////蜂鸣器 开启P06 =1,关闭P06 = 0;
//void Buzzer_Alarm(void)
//{
//		//将main.c的distance变量拿到本文件中，然后外部声明出去，方便这里和主函数的数据调用
//	if (distance) { Buzzer_Time_Flag = distance*10; }	//鸣叫时间 = 距离*10，实现了距离越近，鸣叫时间越短
//	
//	P2 = 0xA0;	// 1010 0000 选中
//	if (1 == Buzzer_Alarm_Flag)	//鸣叫
//	{
////	P06 = 1;
//		P0 = 0x40;	//0100 0000		
//	}
//	else if((0 == Buzzer_Alarm_Flag))	//不鸣叫
//	{
////		P06 = 0;
//		P0 = 0x00;
//	}		



////定时器0中断服务函数
//void Timer0_Rountine(void) interrupt 1
//{
//	static unsigned int T0Count0, Buzzer_Count;
//	
//	T0Count0++;
//	if(T0Count0 >= 200)	//200ms
//	{
//		//执行操作
//		Ultrasonic_Time_Flag = 1;
//		T0Count0 = 0;	//软件复位
//	}
//	
//	Buzzer_Count++;
//	if(Buzzer_Count >= Buzzer_Time_Flag)
//	{
//		Buzzer_Alarm_Flag = !Buzzer_Alarm_Flag;
//		Buzzer_Count = 0;
//	}
//}
